package com.example.common.bean;


import org.springframework.beans.BeansException;
import org.springframework.beans.PropertyValues;
import org.springframework.beans.factory.config.SmartInstantiationAwareBeanPostProcessor;
import org.springframework.stereotype.Component;

//该接口实际是个BeanPostProcessor，它继承自InstantiationAwareBeanPostProcessor，该接口可以实现如下功能：
//提前暴露bean对象的引用（此时还未对属性进行填充），主要来解决循环依赖。
//实例化bean对象之前暴露对象（返回代理对象，而不是实际的对象）。
//实例化bean对象之后（在进行自动装配之前）。
//属性填充（装配当前bean对象所需要的属性）。
@Component
public class PackSmartInstantiationAwareBeanPostProcessor implements SmartInstantiationAwareBeanPostProcessor {

    @Override
    public Object postProcessBeforeInstantiation(Class<?> beanClass, String beanName) throws BeansException {
        // 在实例化之前（也就是当前的对象还没有创建，你可以在这里创建代理对象进行返回）
        return null ;
    }
    @Override
    public boolean postProcessAfterInstantiation(Object bean, String beanName) throws BeansException {
        // 实例化之后，你可以在这里对当前已经创建的bean对象进行相应的操作，只要你这里返回的false，那么后续的自动属性填充将不会执行
        return true ;
    }
    @Override
    public PropertyValues postProcessProperties(PropertyValues pvs, Object bean, String beanName) throws BeansException {
        // 属性填充，你可以根据自己的需要动态的对当前bean对象进行修改，如属性的设置等
        return null ;
    }
    @Override
    public Object getEarlyBeanReference(Object bean, String beanName) throws BeansException {
        // 提前暴露对象
        return bean ;
    }
}
